/*
 * TabMetodos.h
 *
 *  Created on: 02/06/2013
 *      Author: juan
 */

#ifndef TABMETODOS_H_
#define TABMETODOS_H_

#include "gtkmm/frame.h"
#include "gtkmm/notebook.h"

#include "Lavel.h"
#include <gtkmm.h>
#include "model/clases/Metodo.h"
#include "model/clases/Parametro.h"

#include <vector>
#include <map>

class TabMetodos: public Gtk::Frame {
public:
    TabMetodos();
    virtual ~TabMetodos();

    void insertarse(Gtk::Notebook& m_Notebook);
    void inicializarMetodos(std::vector<Metodo*> metodos);
    std::vector<Metodo*> getMetodos();


protected:
    class ModelColumnsMetodos : public Gtk::TreeModel::ColumnRecord{
        public:
        ModelColumnsMetodos(){ add(visibilidad);add(tipo);
              add(nombre);add(parametros);}
          Gtk::TreeModelColumn<Glib::ustring> visibilidad;
          Gtk::TreeModelColumn<Glib::ustring> tipo;
          Gtk::TreeModelColumn<Glib::ustring> nombre;
          Gtk::TreeModelColumn<Glib::ustring> parametros;
    };

    class ModelColumnsParametros : public Gtk::TreeModel::ColumnRecord{
        public:
          ModelColumnsParametros(){ add(tipo);
              add(nombre);add(valor);}
          Gtk::TreeModelColumn<Glib::ustring> tipo;
          Gtk::TreeModelColumn<Glib::ustring> nombre;
          Gtk::TreeModelColumn<Glib::ustring> valor;
    };


private:

    std::string generarListaParametros(std::vector<Parametro*> parametros);

    Gtk::VBox cajaPrincipal;

    Gtk::HBox cajaListaMetodos;
    Gtk::ScrolledWindow ventanaScrolleableMetodos;
    Gtk::TreeView treeViewMetodos;
    Glib::RefPtr<Gtk::TreeStore> treeModelMetodos;
    ModelColumnsMetodos columnasMetodos;


    Gtk::VBox cajaBotonesControlListaMetodos;
    Gtk::Button botonNuevoMetodos;
    Gtk::Button botonEliminarMetodos;


    Gtk::VBox cajaEdicionMetodos;
    Gtk::Frame frameEdicionMetodos;

    Gtk::HBox cajaPropiedadesMetodos;

    Gtk::VBox cajaPropiedadesTextoMetodo;
    Lavel nombreMetodo;
    Lavel tipoMetodo;

    Gtk::VBox cajaVisivilidadMetodo;
    Gtk::RadioButton::Group grupoMetdodo;
    Gtk::RadioButton metodoPublico;
    Gtk::RadioButton metodoPrivado;
    Gtk::RadioButton metodoProtegido;


    Gtk::HBox cajaEdicionParametros;
    Gtk::Frame frameEdicionPrametros;


    Gtk::ScrolledWindow ventanaScrolleableParametros;
    Gtk::TreeView treeViewParametros;
    Glib::RefPtr<Gtk::TreeStore> treeModelParametros;
    ModelColumnsParametros columnasParametros;


    Gtk::VBox cajaBotonesControlListaParametros;
    Gtk::Button nuevoParametro;
    Gtk::Button eliminarParametro;

    Gtk::VBox cajaEdicionParametro;

    Lavel nombreParametro;
    Lavel tipoParametro;
    Lavel valorParametro;

    std::map<std::string,Metodo*> metodos;

    bool metodo_seleccionado;
    bool parametro_seleccionado;
    Gtk::TreeModel::Row row_metodo_anterior;
    Gtk::TreeModel::Row row_parametro_anterior;

    void actualizar_metodo();
    void actualizar_parametro();
    void modificar_parametros_en_metodo(Metodo* metodo);

    void on_button_NuevoMetodo_clicked();
    void on_button_NuevoParametro_clicked();
    void on_button_EliminarMetodo_clicked();
    void on_button_EliminarParametro_clicked();

    void desactivar_entradas_metodos();
    void activar_entradas_metodos();
    void desactivar_entradas_parametros();
    void activar_entradas_parametros();

    void on_row_method_activated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column);
    void on_row_param_activated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column);

    int numeroParametro;
    int numeroMetodo;
    bool eliminarMetodos;

};

#endif /* TABMETODOS_H_ */
